/*
 * FileHandlerInterface.h
 *
 *  Created on: Nov 20, 2012
 *      Author: Federico Orquera
 */

#ifndef FILEHANDLERINTERFACE_H_
#define FILEHANDLERINTERFACE_H_

#include <memory>
#include <string>

#include "../SignatureDefinitions.h"
#include "../SignatureRegister.h"

namespace SignatureSlicingIndex
{

	template < size_t phrases > class FileHandlerInterface {

	public:

		typedef SignatureRegister 	< phrases, KeyWordID >	Slice;
		typedef std::shared_ptr		< Slice >				Slice_ptr;

		FileHandlerInterface( ){}
		virtual ~FileHandlerInterface( ){}

		/**
		 * Devuelve una Porción de Firma
		 *
		 * @param KeyWord Id de la Porción de Firma
		 * @return Un puntero a la Porción de Firma
		 */

		virtual Slice_ptr getSlice( const KeyWordID& KeyWord ) = 0;

		/**
		 * Graba una Porción de Firma
		 *
		 * @param slice Puntero a la Porción de Firma
		 */

		virtual void saveSlice( const Slice_ptr& slice ) = 0;

		/**
		 * Actualiza un bit de una Porción de Firma
		 *
		 * Este método está optimizado para reducir al mínimo
		 *  los accesos a disco cuando solo se desea modificar
		 *  un único bit de toda una firma
		 *
		 * @param sliceNumber Id del Slice
		 * @param bitNumber   bit a modificar (posición relativa dentro del Slice)
		 * @param value Valor en que queres setea el bit ( true para 1, false para 0 )
		 */
		virtual void updateSliceBit( const size_t sliceNumber, size_t bitNumber, bool value ) = 0;

		/**
         * Obtiene el ID del primer slice
         *
         * @return ID del primer slice
		 */
		virtual size_t begin() = 0;

		/**
         * Obtiene el ID del último slice +1
         *
         * @return ID del último slice + 1
		 */
		virtual size_t end() = 0;

	};

}
#endif /* FILEHANDLERINTERFACE_H_ */
